package repJale;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Array;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.Iterator;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.LayoutStyle;
import javax.swing.Timer;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreePath;
import javazoom.jlgui.basicplayer.BasicPlayerException;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.CannotWriteException;
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.audio.mp3.MP3AudioHeader;
import org.jaudiotagger.audio.mp3.MP3File;
import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.Tag;
import org.jaudiotagger.tag.TagException;

/**
* GUI del reproductor.
* @author Eduardo Berbis Gonz·lez, Luis Cruz Bellas, 
*         JosÈ RodrÌguez de Llera Tejeda, ¡lvaro Zapata Montes
*/
public class Jale extends javax.swing.JFrame{

        {
                //Set Look & Feel
                try {
                        javax.swing.UIManager.setLookAndFeel("com.jgoodies.looks.plastic.Plastic3DLookAndFeel");
                } catch(Exception e) {
                        e.printStackTrace();
                }
        }

        private static final long serialVersionUID = 1L;
        Reproductor player=null;
        private JMenuItem ManualInstDesinst;
        private JMenuItem SobreJALE;
        private JMenuItem ManualDeUsuario;
        private JMenu Ayuda;
        private JScrollPane jScrollPane2;
        private JLabel imageSingle;
        private JPanel jPanel4;
        private JButton stop;
        private JMenuItem addCarpeta;
        private JPanel jPanel2;
        private JTree jTree1;
        private JComboBox opcionesBusqueda;
        private JButton buscar;
        private JTextField busqueda;
        private JButton previous;
        private JButton next;
        private JButton mute;
        private JSlider barraVol;
        private JPanel jPanel1;
        private JMenuItem addBiblioteca;
        private static JTable biblioteca;
        private JMenuItem abrir;
        private JMenu jMenu1;
        private JMenuBar jMenuBar1;
        private JLabel inicio;
        private JLabel fin;
        private JSlider barra=null;
        private JButton play;
        private int minIni;
        private int minFin;
        private int segIni;
        private int segFin;
        private double tiempoMediaSeg;
        private int valorBarra;//Se usa para saber cuando avanzamos manualmente la reproduccion (para avanzar y rebobinar)
        private String urlDataSource;//La URL del DataSource que se va a reproducir
        private int cont=0;
        private int cont2=0;
        private Timer timer;
        private Timer timer2;
        private String tagsDinamicos;//Para los tags dinamicos
        private JPanel fondo;
        private boolean silencio=false;
        private static Biblioteca bibliotecaXML;
        private static ArrayList<Cancion> listaCancionesUso;
        private static ArbolCarpetas arbol=null;
        private MiModelo bibliotecaModel=null;
        private static DefaultTreeModel modelo=null;
        private static DefaultMutableTreeNode raiz=null;
        //Desplegable botÃ³n secundario
        private JPopupMenu emergente;//es el "marco" donde se pone el menu
        private JPopupMenu emergenteTree;
        private JMenuItem menus[];//lleva la lista de las opciones
        private JMenuItem menuTree[];
        private JScrollPane jScrollPane1;
        private JLabel nom2;
        private JPanel jPanel3;
        private Image image;
        private Image defaultPic = null;
        private boolean botonIzqPulsado=false;
        private String listaMostrada="Musica";
        private static boolean osWindows;

        /**
         * Crea una GUI con los componentes necesarios para que el usuario pueda interactuar con el reproductor
         */
        public Jale() {
                super();
                //Se detecta el sistema operativo
                String sistemaOperativo = System.getProperty("os.name");
                if(sistemaOperativo.contains("Windows")){//En Windows
                    osWindows=true;
                    defaultPic = new ImageIcon("Images\\DefaultPicture.jpg").getImage();
                }
                else{ 
                	osWindows=false;
                	defaultPic = new ImageIcon("Images/DefaultPicture.jpg").getImage();
                }
                //Se creas la GUI
                initGUI();
                this.setResizable(false);
                this.addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                                bibliotecaXML.guardaBiblioteca();
                                arbol.guardaArbol();
                                try {
									Reproductor.getReproductor().stop();
								} catch (BasicPlayerException e1) {
									// TODO Auto-generated catch block
									e1.printStackTrace();
								}
                        }
                });
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }   
        
        /**
         * Metodo que crea e inicializa los componentes de la GUI
         */
        private void initGUI() {
                try {
                		Bienvenida b=null;
                		if(osWindows)
                			b = new Bienvenida("Images\\Bienvenida.jpg", this, 3000);
                		else
                			b = new Bienvenida("Images/Bienvenida.jpg", this, 3000);
                		//Este Timer se utiliza para actualizar la barra de reproduccion
                        timer = new Timer (1000, new ActionListener ()
                        {
                            public void actionPerformed(ActionEvent e)
                            {
                                actualizaBarra();
                             }
                        });
                        //Este Timer se utiliza para actualizar los tags de la cancion que se estâ€¡ reproduciendo
                        timer2 = new Timer (100, new ActionListener ()
                        {
                            public void actionPerformed(ActionEvent e)
                            {
                                tagsDinamicos();
                             }
                        });
                        this.getContentPane().setBackground(Color.white);
                        {
                                //fondo=new Fondo("FondoNegro.jpg");
                                fondo=new JPanel();
                                //fondo.setImagen("FondoNegro.jpg");
                                this.setContentPane(fondo);
                                GroupLayout thisLayout = new GroupLayout((JComponent)fondo);
                                fondo.setLayout(thisLayout);
                                fondo.setPreferredSize(new java.awt.Dimension(1083, 606));
                                {
                                        //jPanel1 = new Fondo("FondoMetalico.jpg");
                                        jPanel1 = new JPanel();
                                        jPanel1.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.gray,1),jPanel1.getBorder()));
                                        GroupLayout jPanel1Layout = new GroupLayout((JComponent)jPanel1);
                                        jPanel1.setLayout(jPanel1Layout);
                                        jPanel1Layout.setHorizontalGroup(jPanel1Layout.createSequentialGroup()
                                                .addContainerGap()
                                                .addComponent(getNom2(), 0, 437, Short.MAX_VALUE)
                                                .addContainerGap());
                                        jPanel1Layout.setVerticalGroup(jPanel1Layout.createSequentialGroup()
                                                .addComponent(getNom2(), GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 0, Short.MAX_VALUE));
                                }
                                pack();
                                thisLayout.setVerticalGroup(thisLayout.createSequentialGroup()
                                	.addGap(7)
                                	.addGroup(thisLayout.createParallelGroup()
                                	    .addGroup(GroupLayout.Alignment.LEADING, thisLayout.createSequentialGroup()
                                	        .addComponent(getImageSingle(), GroupLayout.PREFERRED_SIZE, 189, GroupLayout.PREFERRED_SIZE)
                                	        .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
                                	        .addComponent(getJScrollPane2(), GroupLayout.PREFERRED_SIZE, 336, GroupLayout.PREFERRED_SIZE))
                                	    .addGroup(GroupLayout.Alignment.LEADING, thisLayout.createSequentialGroup()
                                	        .addGroup(thisLayout.createParallelGroup()
                                	            .addComponent(getJPanel3(), GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 56, GroupLayout.PREFERRED_SIZE)
                                	            .addGroup(GroupLayout.Alignment.LEADING, thisLayout.createSequentialGroup()
                                	                .addGap(14)
                                	                .addComponent(getJPanel4(), GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE)
                                	                .addGap(12)))
                                	        .addGroup(thisLayout.createParallelGroup()
                                	            .addComponent(getJPanel2(), GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 35, GroupLayout.PREFERRED_SIZE)
                                	            .addGroup(GroupLayout.Alignment.LEADING, thisLayout.createSequentialGroup()
                                	                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                                	                .addComponent(jPanel1, GroupLayout.PREFERRED_SIZE, 23, GroupLayout.PREFERRED_SIZE)
                                	                .addGap(6)))
                                	        .addComponent(getJScrollPane1(), GroupLayout.PREFERRED_SIZE, 446, GroupLayout.PREFERRED_SIZE)))
                                	.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED));
                                thisLayout.setHorizontalGroup(thisLayout.createSequentialGroup()
                                	.addContainerGap(24, 24)
                                	.addGroup(thisLayout.createParallelGroup()
                                	    .addComponent(getImageSingle(), GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 244, GroupLayout.PREFERRED_SIZE)
                                	    .addComponent(getJScrollPane2(), GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 244, GroupLayout.PREFERRED_SIZE))
                                	.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
                                	.addGroup(thisLayout.createParallelGroup()
                                	    .addGroup(thisLayout.createSequentialGroup()
                                	        .addGroup(thisLayout.createParallelGroup()
                                	            .addComponent(jPanel1, GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 463, GroupLayout.PREFERRED_SIZE)
                                	            .addComponent(getJPanel3(), GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 463, GroupLayout.PREFERRED_SIZE))
                                	        .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
                                	        .addGroup(thisLayout.createParallelGroup()
                                	            .addGroup(thisLayout.createSequentialGroup()
                                	                .addComponent(getJPanel2(), GroupLayout.PREFERRED_SIZE, 240, GroupLayout.PREFERRED_SIZE)
                                	                .addGap(0, 0, Short.MAX_VALUE))
                                	            .addGroup(GroupLayout.Alignment.LEADING, thisLayout.createSequentialGroup()
                                	                .addGap(18)
                                	                .addComponent(getJPanel4(), GroupLayout.PREFERRED_SIZE, 209, GroupLayout.PREFERRED_SIZE)
                                	                .addGap(0, 13, Short.MAX_VALUE))))
                                	    .addGroup(thisLayout.createSequentialGroup()
                                	        .addComponent(getJScrollPane1(), GroupLayout.PREFERRED_SIZE, 718, GroupLayout.PREFERRED_SIZE)
                                	        .addGap(0, 0, Short.MAX_VALUE)))
                                	.addContainerGap(73, 73));
                        }
                        player=null;
                        //GeneraciÃ³n de la GUI
                        {
                                jMenuBar1 = new JMenuBar();
                                setJMenuBar(jMenuBar1);
                                {
                                        jMenu1 = new JMenu();
                                        jMenuBar1.add(jMenu1);
                                        jMenuBar1.add(getAyuda());
                                        jMenu1.setText("Menú");
                                        {
                                                abrir = new JMenuItem();
                                                abrir.addActionListener(new java.awt.event.ActionListener() {
                                            public void actionPerformed(java.awt.event.ActionEvent evt) {
                                                try {
                                                                        abrirActionPerformed(evt);
                                                                } catch (MalformedURLException e) {
                                                                        // TODO Auto-generated catch block
                                                                        e.printStackTrace();
                                                                } catch (IOException e) {
                                                                        // TODO Auto-generated catch block
                                                                        e.printStackTrace();
                                                                }
                                            }
                                        });
                                                jMenu1.add(abrir);
                                                abrir.setText("Reproducir una canción");
                                        }
                                        {
                                                addBiblioteca = new JMenuItem();
                                                jMenu1.add(addBiblioteca);
                                                addBiblioteca.setText("Cargar canción/es a la biblioteca");
                                                addBiblioteca.addActionListener(new java.awt.event.ActionListener() {
                                            public void actionPerformed(java.awt.event.ActionEvent evt) {
                                                try {
                                                        addBibliotecaActionPerformed(evt);
                                                                }  catch (MalformedURLException e) {
                                                                        // TODO Auto-generated catch block
                                                                        e.printStackTrace();
                                                                } catch (IOException e) {
                                                                        // TODO Auto-generated catch block
                                                                        e.printStackTrace();
                                                                }
                                            }
                                        });
                                        }
                                        {
                                                addCarpeta = new JMenuItem();
                                                jMenu1.add(addCarpeta);
                                                addCarpeta.setText("Cargar carpeta a la biblioteca");
                                                addCarpeta.addActionListener(new java.awt.event.ActionListener() {
                                            public void actionPerformed(java.awt.event.ActionEvent evt) {
                                                try {
                                                        addCarpetaBibliotecaActionPerformed(evt);
                                                                }  catch (MalformedURLException e) {
                                                                        // TODO Auto-generated catch block
                                                                        e.printStackTrace();
                                                                } catch (IOException e) {
                                                                        // TODO Auto-generated catch block
                                                                        e.printStackTrace();
                                                                }
                                            }
                                        });
                                        }
                                }
                        }
                        actualizaInicioFin();
                        {
                                this.setSize(1083, 653);
                        }
                        if(player!=null)
                                timer.start();
                } catch (Exception e) {
                        e.printStackTrace();
                }
                cargaBiblioteca();
                this.imageSingle.setIcon(new ImageIcon(defaultPic));
                cargaArbol();
        }
       
        /**
         * Actualiza la posición de la barra de reproducción y los jLabel de inicio y fin
         */
        public void actualizaBarra(){
                if(player.getTiempo()>=tiempoMediaSeg){
                        next();
                }
                else{
                        double tiempoReproducido=player.getTiempo();
                        //Actualizo la posicion de la barra
                        valorBarra=(int)player.getProgressNow();
                        barra.setValue((int)player.getProgressNow());
                        //Actualizo los tiempo inicio y fin
                        getIni(tiempoReproducido);
                        double tiempoPorReproducir=tiempoMediaSeg-tiempoReproducido;
                        getFin(tiempoPorReproducir);
                        actualizaInicioFin();
                }
        }
       
        /**
         * Cambia los valores de los jLabel inicio y fin
         */
        public void actualizaInicioFin(){
                if(segIni/10<1)
                        inicio.setText(minIni+" : 0"+segIni);
                else
                        inicio.setText(minIni+" : "+segIni);
                if(segFin/10<1)
                        fin.setText("- "+minFin+" : 0"+segFin);
                else
                        fin.setText("- "+minFin+" : "+segFin);
        }
       
        /**
         * Transforma un double en minutos y segundos. 
         * Devuelve un array de dos elementos (en la posicion 0 los minutos y en la posicion 1 los segundos)
         */
        public static int[] getMinSeg(double tiempo){
                double minAux=tiempo/60.0;
                int min=(int)minAux;
                double segAux=minAux-min;
                segAux=segAux*60;
                int seg=(int)segAux;
                int[] minSeg=new int[2];
                minSeg[0]=min;
                minSeg[1]=seg;
                return minSeg;
        }
       
        /**
         * Inicia y pausa la reproducción de una canción
         */
        private void play(){
                if(player==null){
                        CancionActual.setCancionActual(listaCancionesUso.get(0));
                        inicializaRep();
                        actualizaFilaReproducida();
                }else
                        player.play();
                if(player.getEstado()==Reproductor.Estados.pause){
                	if(osWindows)
                		play.setIcon(new ImageIcon("Images\\botones\\playback_play.png"));
               		else
               			play.setIcon(new ImageIcon("Images/botones/playback_play.png"));
                }
                else if(player.getEstado()==Reproductor.Estados.play){
                	if(osWindows)
                        play.setIcon(new ImageIcon("Images\\botones\\playback_pause.png"));
                	else
                		play.setIcon(new ImageIcon("Images/botones/playback_pause.png"));
                }
                else if(player.getEstado()==Reproductor.Estados.stop){
                	if(osWindows)
                        play.setIcon(new ImageIcon("Images\\botones\\playback_play.png"));
                	else
                		play.setIcon(new ImageIcon("Images/botones/playback_play.png"));
                }
        }
       
        /**
         * Finaliza la reproducción de una canción
         */
        public void stop(){
                try {
                        player.stop();
                } catch (BasicPlayerException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                if(osWindows)
                	play.setIcon(new ImageIcon("Images\\botones\\playback_play.png"));
        }
       
        /**
         * Devuelve el jLabel fin actualizado
         * @param t Tiempo en segundos
         * @return JLabel con los minutos y segundos
         */
        private JLabel getFin(double t){
                if(player!=null){
                        int[] minSeg=getMinSeg(t);
                        minFin=minSeg[0];
                        segFin=minSeg[1];
                }
                else{                                  
                        minFin=0;
                        segFin=0;
                }
                return fin;
        }
       
        /**
         * Devuelve el jLabel inicio actualizado
         * @param t Tiempo en segundos
         * @return JLabel con los minutos y segundos
         */
        private JLabel getIni(double t){
                if(player!=null){
                        int[] minSeg=getMinSeg(t);
                        minIni=minSeg[0];
                        segIni=minSeg[1];
                }
                else{                                  
                        minIni=0;
                        segIni=0;
                }
                return fin;
        }
       
        /**
         * Incluye una nueva canción a la biblioteca
         * @param url Ruta donde se encuentra la cancion
         * @throws CannotReadException
         * @throws IOException
         * @throws TagException
         * @throws ReadOnlyFileException
         * @throws InvalidAudioFrameException
         */
        private void addItemBiblioteca(String url) throws CannotReadException, IOException, TagException, ReadOnlyFileException, InvalidAudioFrameException{
                File testFile = new File(url);
                MP3File f = (MP3File)AudioFileIO.read(testFile);
                MP3AudioHeader audioHeader = (MP3AudioHeader) f.getAudioHeader();
                double duracion=audioHeader.getTrackLength();
                String[] tags = getTags(url);
                int i=0;
                if(osWindows)//En Windows
                        i=url.lastIndexOf("\\");
                else
                        i=url.lastIndexOf("/");//Para saber cual es el nombre de la caciÃ³n
                String nombreCancion=url.substring(i+1);
                Cancion c=new Cancion();
                c.setId(""+bibliotecaXML.getUltimaId());
                c.setArtista(tags[0]);
                c.setTitulo(tags[1]);
                c.setAlbum(tags[2]);
                c.setUrl(url);
                c.setDuracion(Double.toString(duracion));
                c.setNombre(nombreCancion);
                if (image == null) c.setImage(defaultPic);
                else c.setImage(image);
                bibliotecaXML.addCancion(c);
        }
       
        /**
         * Modifica la metainformación de una canción
         * @param id
         * @throws CannotReadException
         * @throws IOException
         * @throws TagException
         * @throws ReadOnlyFileException
         * @throws InvalidAudioFrameException
         * @throws CannotWriteException
         */
        public void setTags(String id) throws CannotReadException, IOException, TagException, ReadOnlyFileException, InvalidAudioFrameException, CannotWriteException{
                Cancion c=bibliotecaXML.getCancion(id);
                JFrame frame=new ModificaTags(c);
                frame.setEnabled(true);
                frame.setVisible(true);
                frame.setLocationRelativeTo(null);
                cargaBiblioteca();
        }
       
        /**
         * Devuelve un array de String con el artista, el titulo y el album del fichero mp3
         */
        public String[] getTags(String url) throws CannotReadException, IOException, TagException, ReadOnlyFileException, InvalidAudioFrameException{          
                File testFile = new File(url);
                AudioFile f = AudioFileIO.read(testFile); // Se accede al archivo deseado con la opciÃ³n de lectura.
                Tag tag = f.getTag(); // Se crea un objeto de tipo Tag a partir del archivo accedido
                String [] tags = new String[3];
                image = null;
                if(tag!=null){
                        if (tag.getFirstArtwork() != null) {
                        	try{
                        		image = tag.getFirstArtwork().getImage();
                        		ImageIcon fot = new ImageIcon(tag.getFirstArtwork().getImage());
                        		image = new ImageIcon(fot.getImage().getScaledInstance(imageSingle.getWidth(), imageSingle.getHeight(), Image.SCALE_DEFAULT)).getImage();
                        	}catch(Exception e){
                        		image = this.defaultPic;
                        	}
                        }
                        else image = this.defaultPic;
                }else {
                        image = this.defaultPic;
                }
                if(tag!=null){  
                        String item=tag.getFirst(FieldKey.ARTIST); // Devuelve el ARTISTA.
                        if(item!="")
                                tags[0] = item;
                        else
                                tags[0]="Desconocido";
                        item=tag.getFirst(FieldKey.TITLE); // Devuelve el TÃ�TULO al que pertenece la pista.
                        if(item!="")
                                tags[1] = item;
                        else
                                tags[1]="Desconocido";
                        item=tag.getFirst(FieldKey.ALBUM); // Devuelve el ALBUM de la pista
                        if(item!="")
                                tags[2] = item;
                        else
                                tags[2]="Desconocido";
                }
                else{
                        tags[0]="Desconocido";
                        tags[1]="Desconocido";
                        tags[2]="Desconocido";
                }
                return tags;
        }
       
        /**
         * Prepara el reproductor para reproducir una canción
         */
        private void inicializaRep(){
                timer2.start();
                double vol=barraVol.getValue()/(double)barraVol.getMaximum();
                //player=new Reproductor(urlDataSource,vol,silencio);
                player=Reproductor.getReproductor();//new Reproductor(CancionActual.getCancionActual().url,vol,silencio);
                player.setReproductor(CancionActual.getCancionActual().url,vol,silencio);
                //Tiempo de duracion del DataSoure
                tiempoMediaSeg=player.getDuracion();
                barra.setMaximum((int)player.getBytesLength());//con este metodo determino el numero de saltos que va a tener la barra
                play.setEnabled(true);
                stop.setEnabled(true);
                previous.setEnabled(true);
                next.setEnabled(true);
                barra.setEnabled(true);
                mute.setEnabled(true);
                barraVol.setEnabled(true);
                actualizaTags();
                timer.start();  
                play();
        }
       
        /**
         * Prepara la GUI para visualizar la metainformación de la cancion que se va a reproducir
         */
        private void actualizaTags(){
                try {
                        //String[] tags = getTags(urlDataSource);
                        String[] tags = getTags(CancionActual.getCancionActual().url);
                        int i=0;
                        if(osWindows)//En Windows
                                i=CancionActual.getCancionActual().getUrl().lastIndexOf("\\");
                        else
                                i=CancionActual.getCancionActual().getUrl().lastIndexOf("/");//Para saber cual es el nombre de la caciÃ³n
                        String nombre=CancionActual.getCancionActual().getUrl().substring(i+1);
                        nom2.setText(nombre);
                        CancionActual.getCancionActual().setNombre(nombre);
                        CancionActual.getCancionActual().setArtista(tags[0]);
                        CancionActual.getCancionActual().setTitulo(tags[1]);
                        CancionActual.getCancionActual().setAlbum(tags[2]);
                        CancionActual.getCancionActual().setImage(image);
                        //if (CancionActual.getCancionActual().getImage() == null) CancionActual.getCancionActual().setImage(defaultPic);
                        this.imageSingle.setIcon(new ImageIcon(CancionActual.getCancionActual().getImage()));
                        tagsDinamicos="";
                        cont=0;
                        cont2=0;
                } catch (CannotReadException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (TagException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (ReadOnlyFileException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (InvalidAudioFrameException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
       
        /**
         * Muestra la metainformación de la canción reproducida.
         */
        private void tagsDinamicos(){
                if(cont==0){
                        for(int j=0;j<140;j++){//100 se ha sacado probando
                                tagsDinamicos+=" ";
                        }
                }
                if(cont2==4)
                        cont2=0;
                int espacio1=CancionActual.getCancionActual().getTitulo().length();
                int espacio2=CancionActual.getCancionActual().getArtista().length();
                int espacio3=CancionActual.getCancionActual().getAlbum().length();
                if(cont<espacio1){
                        tagsDinamicos=tagsDinamicos+CancionActual.getCancionActual().getTitulo().charAt(cont);
                        cont++;
                }else if(cont==espacio1){
                        if(cont2<4){
                                switch(cont2){
                                        case 0: tagsDinamicos=tagsDinamicos+" ";cont2++;break;
                                        case 1: tagsDinamicos=tagsDinamicos+"-";cont2++;break;
                                        case 2: tagsDinamicos=tagsDinamicos+"-";cont2++;break;
                                        case 3: tagsDinamicos=tagsDinamicos+" ";cont2++;cont++;break;
                                }
                        }
                }else if((cont-espacio1-1)<espacio2){
                        tagsDinamicos=tagsDinamicos+CancionActual.getCancionActual().getArtista().charAt(cont-espacio1-1);
                        cont++;
                }else if(cont-espacio1-1==espacio2){
                        if(cont2<4){
                                switch(cont2){
                                        case 0: tagsDinamicos=tagsDinamicos+" ";cont2++;break;
                                        case 1: tagsDinamicos=tagsDinamicos+"-";cont2++;break;
                                        case 2: tagsDinamicos=tagsDinamicos+"-";cont2++;break;
                                        case 3: tagsDinamicos=tagsDinamicos+" ";cont2++;cont++;break;
                                }
                        }
                }else if((cont-espacio1-espacio2-2)<espacio3){
                        tagsDinamicos=tagsDinamicos+CancionActual.getCancionActual().getAlbum().charAt(cont-espacio1-espacio2-2);
                        cont++;
                }else{
                        cont++;
                }
                if(tagsDinamicos.equals("")){
                        cont=0;
                }
                else
                        tagsDinamicos=tagsDinamicos.substring(1);
                nom2.setText(tagsDinamicos);
        }
       
        /**
         * Reproduce una canción que no se encuentra en la biblioteca
         * @param evt
         * @throws MalformedURLException
         * @throws IOException
         */
        private void abrirActionPerformed(java.awt.event.ActionEvent evt) throws MalformedURLException, IOException {
                JFileChooser jFileChooser= new JFileChooser();
        jFileChooser.setMultiSelectionEnabled(false);
        jFileChooser.setDialogTitle("Seleccionando una canción para reproducir...");
        if(jFileChooser.showOpenDialog(abrir) != JFileChooser.CANCEL_OPTION){
        		setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                if(player!=null){
                player.liberaPlayer();
            }
                urlDataSource = jFileChooser.getSelectedFile().getPath();
                int index = urlDataSource.lastIndexOf('.');
                        String extension = urlDataSource.substring(index+1);
                        Cancion c = new Cancion();
                        c.url = urlDataSource;
                        CancionActual.setCancionActual(c);
                        if(extension.equals("mp3")){
                                inicializaRep();
                        }
                        else    
                                JOptionPane.showMessageDialog(null, "El fichero debe estar en formato mp3", "Error", JOptionPane.ERROR_MESSAGE);
                        setCursor(null);
        }        
        }
       
        /**
         * Muestra el manual de usuario
         * @param evt
         * @throws MalformedURLException
         * @throws IOException
         */
        private void manualDeUsuarioActionPerformed(java.awt.event.ActionEvent evt) throws MalformedURLException, IOException {
        	String dir = System.getProperty("user.dir");
        	if(this.osWindows)//En Windows
                   dir = dir + "\\Manuales\\";
        	else
                   dir = dir + "/Manuales/";
    		try {
    		     File path = new File (dir + "ManualJALE.pdf");
    		     Desktop.getDesktop().open(path);
    		}catch (IOException ex) {
    		     ex.printStackTrace();
    		}
        }
        
        /**
         * Muestra el manual de instalación/desinstalación
         * @param evt
         * @throws MalformedURLException
         * @throws IOException
         */
        private void manualDeInstDesinstActionPerformed(java.awt.event.ActionEvent evt) throws MalformedURLException, IOException {
        	String dir = System.getProperty("user.dir");
        	if(this.osWindows)//En Windows
                   dir = dir + "\\Manuales\\";
        	else
                   dir = dir + "/Manuales/";
    		try {
    		     File path = new File (dir + "ManualInstalacion-Desinstalacion.pdf");
    		     Desktop.getDesktop().open(path);
    		}catch (IOException ex) {
    		     ex.printStackTrace();
    		}
        }
        
        /**
         * Recoge la(s) ruta(s) de la(s) cancion(es) que se desean incluir en la biblioteca
         * @param evt
         * @throws MalformedURLException
         * @throws IOException
         */
        private void addBibliotecaActionPerformed(java.awt.event.ActionEvent evt) throws MalformedURLException, IOException {
                JFileChooser jFileChooser= new JFileChooser();
        jFileChooser.setMultiSelectionEnabled(true);
        jFileChooser.setDialogTitle("Seleccionando una o varias canciones para cargar en la biblioteca...");
        if(jFileChooser.showOpenDialog(abrir) != JFileChooser.CANCEL_OPTION){
        		setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                int numArch = jFileChooser.getSelectedFiles().length;
                File[] archivos = jFileChooser.getSelectedFiles();
                for(int i=0;i<numArch;i++){
                                String url = archivos[i].getPath();
                                int index = url.lastIndexOf('.');
                                String extension = url.substring(index+1);
                                if(extension.equals("mp3")){
                                        try {
                                                addItemBiblioteca(url);
                                        } catch (CannotReadException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        } catch (TagException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        } catch (ReadOnlyFileException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        } catch (InvalidAudioFrameException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                }      
                                else    
                                        JOptionPane.showMessageDialog(null, "El fichero debe estar en formato mp3", "Error", JOptionPane.ERROR_MESSAGE);
                }
                cargaBiblioteca();
                setCursor(null);
        }            
        }
       
        /**
         * Incluye en la biblioteca todos los ficheros mp3 que contiene el directorio especificado con la ruta. Hace los mismo con los subdirectorios
         * contenidos en dicha ruta
         * @param url
         */
        private void  addDirectorios(String url){
                File f=new File(url);
                String ficheros[]=f.list();//Contiene todos los ficheros y subdirectorio del directorio que representa "url"
                ArrayList<String> directorios=new ArrayList<String>();//Contiene los subdirectorios del directorio que representa "url"
                if (ficheros != null) {
                for (int x=0;x<ficheros.length;x++){//Se recrren los directorios
                        File fActual=null;
                        if(osWindows)//En Windows
                                fActual=new File(url+"\\"+ficheros[x]);
                        else
                                fActual=new File(url+"/"+ficheros[x]);
                        if(fActual.isDirectory())//Se comprueba si ficheros[x] es un directorio
                                if(osWindows)//En Windows
                                        directorios.add(url+"\\"+ficheros[x]);
                                else
                                        directorios.add(url+"/"+ficheros[x]);
                        else{
                                int index = ficheros[x].lastIndexOf('.');
                                        String extension = ficheros[x].substring(index+1);
                                        if(extension.equals("mp3")){//Se comprueba que tenga extension "mp3"
                                                try {
                                                        if(osWindows)
                                                                addItemBiblioteca(url+"\\"+ficheros[x]);
                                                        else
                                                                addItemBiblioteca(url+"/"+ficheros[x]);
                                                } catch (CannotReadException e) {
                                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                                } catch (IOException e) {
                                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                                } catch (TagException e) {
                                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                                } catch (ReadOnlyFileException e) {
                                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                                } catch (InvalidAudioFrameException e) {
                                                        // TODO Auto-generated catch block
                                                        e.printStackTrace();
                                                }
                                        }
                        }
                        bibliotecaXML.ordenaBiblioteca(Biblioteca.Orden.nombre,listaCancionesUso);
                }
        }
        if(!directorios.isEmpty()){//Se recorren los subdirectorios encontrdos y se llama de forma recursiva a la funcion con cada uno de ellos
                Iterator<String> it=directorios.iterator();
                while(it.hasNext()){
                        String dir=(String) it.next();
                        addDirectorios(dir);
                }
        }
        }
       
        /**
         * Captura la ruta de la carpeta que queremos incluir en la biblioteca
         * @param evt
         * @throws MalformedURLException
         * @throws IOException
         */
        private void addCarpetaBibliotecaActionPerformed(java.awt.event.ActionEvent evt) throws MalformedURLException, IOException {
                JFileChooser jFileChooser= new JFileChooser();
                jFileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                jFileChooser.setDialogTitle("Seleccionando una carpeta con canciones para cargar en la biblioteca...");
        if(jFileChooser.showOpenDialog(abrir) != JFileChooser.CANCEL_OPTION){
        	setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                String direccion = jFileChooser.getSelectedFile().getPath();
            addDirectorios(direccion);
            cargaBiblioteca();
            setCursor(null);
        }            
        }
       
        private void silencio(){
                if (!silencio){
                        if(player!=null)
                                player.setNivelVolumen((float)0.0);
                        if(osWindows)
                        	mute.setIcon(new ImageIcon("Images\\botones\\sound_mute.png"));
                        else
                        	mute.setIcon(new ImageIcon("Images/botones/sound_mute.png"));
                        silencio=true;
                }
                else{
                        if(player!=null){
                                int val=barraVol.getValue();
                                int div=barraVol.getMaximum();
                                player.setNivelVolumen(val/(float)div);
                        }
                        if(osWindows)
                        	mute.setIcon(new ImageIcon("Images\\botones\\sound_high.png"));
                        else
                        	mute.setIcon(new ImageIcon("Images/botones/sound_high.png"));
                        silencio=false;
                }
        }
       
        /**
         * Carga el jTree con las listas de reproducción
         */
        public static void cargaArbol(){
                if(arbol==null){
                	if(osWindows)
                        arbol=new ArbolCarpetas("Data\\ArbolCarpetas.xml");
                	else
                		arbol=new ArbolCarpetas("Data/ArbolCarpetas.xml");
                }
                int numHijos=modelo.getChildCount(raiz);
                for(int i=0;i<numHijos;i++){//Se eliminan los nodos del jTree
                        MutableTreeNode h=(MutableTreeNode) modelo.getChild(raiz, 0);
                        modelo.removeNodeFromParent(h);
                }
                Iterator<Carpeta> it=arbol.getCarpetas().iterator();
                while(it.hasNext()){
                        Carpeta c=(Carpeta)it.next();
                        DefaultMutableTreeNode hijo = new DefaultMutableTreeNode(c.getNombre());
                        modelo.insertNodeInto(hijo,raiz,0);
                }
        }
       
        /**
         * Carga en la tabla las canciones de la biblioteca
         */
        static void cargaBiblioteca(){
                ((DefaultTableModel)biblioteca.getModel()).setRowCount(0);
                if(bibliotecaXML==null){
                	if(osWindows)
                        bibliotecaXML=new Biblioteca("Data\\Biblioteca.xml");
                	else
                		bibliotecaXML=new Biblioteca("Data/Biblioteca.xml");
                	listaCancionesUso=bibliotecaXML.getBiblioteca();
                    bibliotecaXML.ordenaBiblioteca(Biblioteca.Orden.nombre,listaCancionesUso);
                }
                Iterator<Cancion> it=listaCancionesUso.iterator();
                while(it.hasNext()){
                        Cancion c=it.next();
                        int[] dur=getMinSeg(Double.parseDouble(c.getDuracion()));
                        String d="";
                        if(dur[1]<10)
                                d=dur[0]+":0"+dur[1];
                        else
                                d=dur[0]+":"+dur[1];
                        ((DefaultTableModel)biblioteca.getModel()).addRow(new Object[]{c.getId(),c.getNombre(),c.getTitulo(),c.getArtista(),c.getAlbum(),d});                  
                }
        }
       
        /**
         * Pasa a reproducir la siguiente cancion de la lista
         */
        private void next() {
                //ArrayList<Cancion> B = this.bibliotecaXML.getBiblioteca();
                Iterator<Cancion> itB = listaCancionesUso.iterator();
                int index = 0;          // Indice de la cancion buscada dentro de la biblioteca.
                boolean found = false;  // Booleano de parada.
                while ((itB.hasNext()) && (!found)){
                        Cancion c = (Cancion) itB.next();
                        //if (c.url.equalsIgnoreCase(this.urlDataSource)) found = true; // Â¿Se encuentra la canciÃ³n en la biblioteca?
                        if (c.id.equalsIgnoreCase(CancionActual.getCancionActual().id)) found = true; // Â¿Se encuentra el Id de la canciÃ³n en la biblioteca?
                        else index++;
                }
                index++;                                 // Ã�ndice actualizado para la siguiente canciÃ³n.
                if ((index >=0) && (index<listaCancionesUso.size())) {                  // Si hay siguiente canciÃ³n ->                      
                        Cancion cToPlay = (Cancion) listaCancionesUso.get(index);      // -> se obtiene.
                        this.urlDataSource = cToPlay.url;
                        CancionActual.setCancionActual(cToPlay);
                        if (player!=null) player.liberaPlayer();
                        inicializaRep();
                actualizaFilaReproducida();
                }
                /*else if (wantsRepeatAll){    
                        Cancion cToPlay = B.get(0);      
                        this.urlDataSource = cToPlay.url;
                        CancionActual.setCancionActual(cToPlay);
                        if (player!=null) player.liberaPlayer();
                        inicializaRep();
                }*/
        }
       
        /**
         * Pasa a reproducir la cancion anterior de la lista
         */
        private void previous() {
                //ArrayList<Cancion> B = this.bibliotecaXML.getBiblioteca();
                Iterator<Cancion> itB = listaCancionesUso.iterator();
                int index = 0;          // Ã�ndice de la canciÃ³n buscada dentro de la biblioteca.
                boolean found = false;  // Booleano de parada.
                while ((itB.hasNext()) && (!found)){
                        Cancion c = (Cancion) itB.next();
                        //if (c.url.equalsIgnoreCase(this.urlDataSource)) found = true; // Â¿Se encuentra la canciÃ³n en la biblioteca?
                        if (c.id.equalsIgnoreCase(CancionActual.getCancionActual().id)) found = true; // Â¿Se encuentra el Id de la canciÃ³n en la biblioteca?
                        else index++;
                }
                index--;                                 // Ã�ndice actualizado para la canciÃ³n anterior.
                if ((index >=0) && (index<listaCancionesUso.size()-1)) {                         // Si hay canciÃ³n anterior, ->                    
                        Cancion cToPlay = listaCancionesUso.get(index);      // -> se obtiene.
                        this.urlDataSource = cToPlay.url;
                        CancionActual.setCancionActual(cToPlay);
                        if (player!=null) player.liberaPlayer();
                        inicializaRep();
                        actualizaFilaReproducida();
                }
                else {  
                        Cancion cToPlay = listaCancionesUso.get(0);      
                        this.urlDataSource = cToPlay.url;
                        CancionActual.setCancionActual(cToPlay);
                        if (player!=null) player.liberaPlayer();
                        inicializaRep();
                }
        }
       
        /**
         * Busca las canción que cumplan con determinados requisitos
         * @param val La búsqueda que desea realizar el usuario
         * @param op El criterio elegido por el usuario para realizar la búsqueda
         */
        private void buscaCanciones(String val,String op){
                Biblioteca.Orden opcion=Biblioteca.Orden.todo;
                if(op.equals("Todo")){
                        opcion=Biblioteca.Orden.todo;
                }
                else if(op.equals("Nombre")){
                        opcion=Biblioteca.Orden.nombre;
                }
                else if(op.equals("Titulo")){
                        opcion=Biblioteca.Orden.titulo;
                }
                else if(op.equals("Artista")){
                        opcion=Biblioteca.Orden.artista;
                }
                else if(op.equals("Album")){
                        opcion=Biblioteca.Orden.album;
                }
                listaCancionesUso=bibliotecaXML.buscaCanciones(val,opcion,listaCancionesUso);
                cargaBiblioteca();              
        }

        
        private JTextField getBusqueda() {
                if(busqueda == null) {
                        busqueda = new JTextField();
                        busqueda.setText("Buscar...");
                        busqueda.addKeyListener(new KeyListener(){
                                public void keyTyped ( KeyEvent e ){  
                                }  
                                public void keyPressed ( KeyEvent e){  
                                       
                                }  
                                public void keyReleased ( KeyEvent e ){
                                        buscaCanciones(busqueda.getText(),(String)opcionesBusqueda.getSelectedItem());
                                        actualizaFilaReproducida();
                                }                              
                        });
                        busqueda.addMouseListener(new MouseListener(){
                                public void mouseClicked(MouseEvent arg0) {
                                        busqueda.setText("");
                                }
                                public void mouseEntered(MouseEvent arg0) {}
                                public void mouseExited(MouseEvent arg0) {}
                                public void mousePressed(MouseEvent arg0) {}
                                public void mouseReleased(MouseEvent arg0) {}
                               
                        });
                }
                return busqueda;
        }
       
        private JButton getBuscar() {
                if(buscar == null) {
                        buscar = new JButton();
                        buscar.setText("Limpiar");
                        buscar.addActionListener(new ActionListener()
                        {
                                public void actionPerformed(ActionEvent e){
                                        busqueda.setText("");
                                        if(listaMostrada.equals("Musica"))
                                                listaCancionesUso=bibliotecaXML.getBiblioteca();
                                        else
                                                cargaLista(listaMostrada);
                                        cargaBiblioteca();
                                }
                        }
                        );
                }
                return buscar;
        }
       
        private JComboBox getOpcionesBusqueda() {
                if(opcionesBusqueda == null) {
                        ComboBoxModel opcionesBusquedaModel =
                                new DefaultComboBoxModel(
                                                new String[] { "Todo", "Nombre", "Titulo", "Artista", "Album" });
                        opcionesBusqueda = new JComboBox();
                        opcionesBusqueda.setModel(opcionesBusquedaModel);
                }
                return opcionesBusqueda;
        }
       
        private JTree getJTree1() {
                if(jTree1 == null) {
                        raiz=new DefaultMutableTreeNode("Musica");
                        modelo=new DefaultTreeModel(raiz);
                        jTree1 = new JTree(modelo);
                       
                     DefaultTreeCellRenderer render= (DefaultTreeCellRenderer)jTree1.getCellRenderer();
                     if(osWindows){
                    	 render.setLeafIcon(new ImageIcon("Images\\notaMusical2.png"));
                    	 render.setOpenIcon(new ImageIcon("Images\\notaMusical.png"));
                    	 render.setClosedIcon(new ImageIcon("Images\\notaMusical.png"));
                     }
                     else{
                    	 render.setLeafIcon(new ImageIcon("Images/notaMusical2.png"));
                    	 render.setOpenIcon(new ImageIcon("Images/notaMusical.png"));
                    	 render.setClosedIcon(new ImageIcon("Images/notaMusical.png"));
                     }
                }
                jTree1.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.gray,0),jPanel1.getBorder()));
                jTree1.addMouseListener(new MouseAdapter(){
            public void mouseClicked(final MouseEvent e){
                if(e.getButton()==MouseEvent.BUTTON1){
                    if (e.getClickCount() == 2 && botonIzqPulsado){
                        listaMostrada=jTree1.getSelectionPath().getLastPathComponent().toString();
                        TreePath path = jTree1.getSelectionPath();
                        cargaLista(path.getLastPathComponent().toString());
                    }
                    botonIzqPulsado=true;
                }
                if(e.getButton()==MouseEvent.BUTTON3){
                    menuTree= new JMenuItem[1];
                    menuTree[0]= new JMenuItem("Eliminar");
                    menuTree[0].addActionListener(new ActionListener(){
                        public void actionPerformed(ActionEvent evt){
                            DefaultMutableTreeNode nodo;
                            TreePath[] paths = jTree1.getSelectionPaths();
                            if(paths!=null){
                                if(!paths[0].getLastPathComponent().toString().equals("Musica")){
                                        boolean sel=false;//Para saber si una de las listas que se van a eliminar es la que se esta mostrando
                                        for (int i = 0; i < paths.length; i++) {
                                                nodo = (DefaultMutableTreeNode) (paths[i].getLastPathComponent());
                                                modelo.removeNodeFromParent(nodo);
                                                arbol.removeCarpeta(paths[i].getLastPathComponent().toString());
                                                if(listaMostrada.equals(paths[i].getLastPathComponent().toString()))
                                                        sel=true;
                                        }
                                        if(sel){
                                                listaCancionesUso=bibliotecaXML.getBiblioteca();
                                                cargaBiblioteca();
                                        }
                                        }
                            }
                        }
                    });
                    emergenteTree= new JPopupMenu();
                    for(byte x=0;x<menuTree.length;x++){
                        emergenteTree.add(menuTree[x]);
                        }
                    emergenteTree.show(jTree1,e.getX(),e.getY());
                    }
                }
        });
                return jTree1;
        }
       
        private JPanel getJPanel2() {
                if(jPanel2 == null) {
                        jPanel2 = new JPanel();
                        GroupLayout jPanel2Layout = new GroupLayout((JComponent)jPanel2);
                        jPanel2.setLayout(jPanel2Layout);
                        jPanel2Layout.setHorizontalGroup(jPanel2Layout.createSequentialGroup()
                                .addComponent(getBuscar(), GroupLayout.PREFERRED_SIZE, 77, GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(getBusqueda(), GroupLayout.PREFERRED_SIZE, 71, GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(getOpcionesBusqueda(), 0, 75, Short.MAX_VALUE));
                        jPanel2Layout.setVerticalGroup(jPanel2Layout.createSequentialGroup()
                                .addGap(7)
                                .addGroup(jPanel2Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                    .addComponent(getOpcionesBusqueda(), GroupLayout.Alignment.BASELINE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE)
                                    .addComponent(getBuscar(), GroupLayout.Alignment.BASELINE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE)
                                    .addComponent(getBusqueda(), GroupLayout.Alignment.BASELINE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED));
                }
                return jPanel2;
        }
       
        /**
         * Cambia el color a la canción que está siendo reproducida
         */
        private void actualizaFilaReproducida(){
                String id=CancionActual.getCancionActual().getId();
                int numFilas=biblioteca.getRowCount();
                int fila=0;
                boolean encontrado=false;
                while (!encontrado && fila<numFilas){
                        if(bibliotecaModel.getValueAt(fila,0).equals(id))
                                encontrado=true;
                        else
                                fila++;
                }
                if(encontrado){
                        ((MiTabla) biblioteca).setFilaReproducida(fila);
                }
                else{
                        ((MiTabla) biblioteca).setFilaReproducida(-1);
                }
                biblioteca.repaint();
        }
       
        private JPanel getJPanel3() {
                if(jPanel3 == null) {
                        jPanel3 = new JPanel();
                        //jPanel3.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.gray,1),jPanel3.getBorder()));
                        GroupLayout jPanel3Layout = new GroupLayout((JComponent)jPanel3);
                        jPanel3.setLayout(jPanel3Layout);
                        {
                                play = new JButton();
                                if(osWindows)
                                	play.setIcon(new ImageIcon("Images\\botones\\playback_play.png"));
                                else
                                	play.setIcon(new ImageIcon("Images/botones/playback_play.png"));
                                        play.addActionListener(new ActionListener()
                                        {
                                                public void actionPerformed(ActionEvent e){
                                                        play();
                                                }
                                        }
                                        );
                                }
                                {
                                        stop = new JButton();
                                        if(osWindows)
                                        	stop.setIcon(new ImageIcon("Images\\botones\\playback_stop.png"));
                                        else
                                        	stop.setIcon(new ImageIcon("Images/botones/playback_stop.png"));
                                        stop.addActionListener(new ActionListener()
                                        {
                                                public void actionPerformed(ActionEvent e){
                                                        stop();
                                                }
                                        }
                                        );
                                        previous = new JButton();
                                        if(osWindows)
                                        	previous.setIcon(new ImageIcon("Images\\botones\\playback_prev.png"));
                                        else
                                        	previous.setIcon(new ImageIcon("Images/botones/playback_prev.png"));
                                        previous.addActionListener(new ActionListener()
                                        {
                                                public void actionPerformed(ActionEvent e){
                                                        previous();
                                                }
                                        }
                                        );
                                        next = new JButton();
                                        if(osWindows)
                                        	next.setIcon(new ImageIcon("Images\\botones\\playback_next.png"));
                                        else
                                        	next.setIcon(new ImageIcon("Images/botones/playback_next.png"));
                                        next.addActionListener(new ActionListener()
                                        {
                                                public void actionPerformed(ActionEvent e){
                                                        next();
                                                }
                                        }
                                        );
                                       
                                }
                                {
                                        barra=new JSlider();
                                        barra.setValue(0);
                                        barra.addMouseListener(new MouseListener(){
                                                public void mouseClicked(MouseEvent arg0) {
                                                }
                                                public void mouseEntered(MouseEvent arg0) {    
                                                }
                                                public void mouseExited(MouseEvent arg0) {      
                                                }
                                                public void mousePressed(MouseEvent arg0) {    
                                                }
                                                public void mouseReleased(MouseEvent arg0) {
                                                        if(player!=null){
                                                                long val=barra.getValue();
                                                                long comp=Math.abs(valorBarra-val);
                                                                if(comp>1){ //Compruebo que la barra se ha desplazado una distancia de mas de un segundo con repecto a su posicion anterior
                                                                        timer.stop();
                                                                player.setTiempo(val);
                                                                timer.restart();
                                                                }
                                                        }      
                                                }
                                        });
                                }
                                {
                                        fin=new JLabel("Fin");
                                        getFin(tiempoMediaSeg);
                                }
                                {
                                        inicio = new JLabel("Ini");
                                        getIni(0);
                                }
                        jPanel3Layout.setHorizontalGroup(jPanel3Layout.createSequentialGroup()
                                        .addContainerGap()
                                        .addGroup(jPanel3Layout.createParallelGroup()
                                            .addGroup(jPanel3Layout.createSequentialGroup()
                                                .addComponent(barra, GroupLayout.PREFERRED_SIZE, 447, GroupLayout.PREFERRED_SIZE)
                                                .addGap(0, 0, Short.MAX_VALUE))
                                            .addGroup(GroupLayout.Alignment.LEADING, jPanel3Layout.createSequentialGroup()
                                                .addPreferredGap(barra, inicio, LayoutStyle.ComponentPlacement.INDENT)
                                                .addComponent(inicio, GroupLayout.PREFERRED_SIZE, 51, GroupLayout.PREFERRED_SIZE)
                                                .addGap(61)
                                                .addComponent(previous, GroupLayout.PREFERRED_SIZE, 27, GroupLayout.PREFERRED_SIZE)
                                                .addGap(20)
                                                .addComponent(play, GroupLayout.PREFERRED_SIZE, 25, GroupLayout.PREFERRED_SIZE)
                                                .addGap(19)
                                                .addComponent(stop, GroupLayout.PREFERRED_SIZE, 24, GroupLayout.PREFERRED_SIZE)
                                                .addGap(27)
                                                .addComponent(next, GroupLayout.PREFERRED_SIZE, 26, GroupLayout.PREFERRED_SIZE)
                                                .addGap(0, 93, Short.MAX_VALUE)
                                                .addComponent(fin, GroupLayout.PREFERRED_SIZE, 54, GroupLayout.PREFERRED_SIZE)
                                                .addGap(0, 8, GroupLayout.PREFERRED_SIZE)))
                                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED));
                        jPanel3Layout.setVerticalGroup(jPanel3Layout.createSequentialGroup()
                                        .addGroup(jPanel3Layout.createParallelGroup()
                                            .addGroup(GroupLayout.Alignment.LEADING, jPanel3Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                                .addComponent(previous, GroupLayout.Alignment.BASELINE, GroupLayout.PREFERRED_SIZE, 27, GroupLayout.PREFERRED_SIZE)
                                                .addComponent(play, GroupLayout.Alignment.BASELINE, 0, 28, Short.MAX_VALUE)
                                                .addComponent(stop, GroupLayout.Alignment.BASELINE, 0, 28, Short.MAX_VALUE)
                                                .addComponent(next, GroupLayout.Alignment.BASELINE, 0, 28, Short.MAX_VALUE))
                                            .addGroup(jPanel3Layout.createSequentialGroup()
                                                .addGap(12)
                                                .addGroup(jPanel3Layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                                                    .addComponent(inicio, GroupLayout.Alignment.BASELINE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE)
                                                    .addComponent(fin, GroupLayout.Alignment.BASELINE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE))))
                                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(barra, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE, GroupLayout.PREFERRED_SIZE)
                                        .addGap(7));
                }
                return jPanel3;
        }
               
                private JPanel getJPanel4() {
                        if(jPanel4 == null) {
                                jPanel4 = new JPanel();
                                GroupLayout jPanel4Layout = new GroupLayout((JComponent)jPanel4);
                                jPanel4.setLayout(jPanel4Layout);
                                {
                                        barraVol = new JSlider();
                                        barraVol.setOrientation(0);
                                        barraVol.setMaximum(10);//lo pongo en 10 porque no trata con float y el mÃ¡ximo de jmf de volumen es 1
                                        barraVol.setValue(5);
                                        barraVol.addMouseListener(new MouseListener(){
                                                public void mouseReleased(MouseEvent arg0) {
                                                        if(player!=null){
                                                                float val=barraVol.getValue();
                                                                player.setNivelVolumen(val/barraVol.getMaximum());
                                                                barraVol.setValue((int) val);
                                                                if(silencio)
                                                                        silencio();
                                                        }      
                                                }
                                                public void mouseClicked(MouseEvent arg0) {
                                                }
                                                public void mouseEntered(MouseEvent arg0) {
                                                }
                                                public void mouseExited(MouseEvent arg0) {
                                                }
                                                public void mousePressed(MouseEvent arg0) {
                                                }
                                        });
                                }
                                {
                                        mute = new JButton();
                                        if(osWindows)
                                        	mute.setIcon(new ImageIcon("Images\\botones\\sound_high.png"));
                                        else
                                        	mute.setIcon(new ImageIcon("Images/botones/sound_high.png"));
                                        mute.addActionListener(new ActionListener()
                                        {
                                                public void actionPerformed(ActionEvent e){
                                                        silencio();
                                                }
                                        });                                    
                                }
                                jPanel4Layout.setHorizontalGroup(jPanel4Layout.createSequentialGroup()
                                        .addContainerGap()
                                        .addComponent(mute, GroupLayout.PREFERRED_SIZE, 27, GroupLayout.PREFERRED_SIZE)
                                        .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(barraVol, 0, 147, Short.MAX_VALUE)
                                        .addContainerGap());
                                jPanel4Layout.setVerticalGroup(jPanel4Layout.createSequentialGroup()
                                        .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 0, Short.MAX_VALUE)
                                        .addGroup(jPanel4Layout.createParallelGroup()
                                            .addComponent(barraVol, GroupLayout.Alignment.LEADING, GroupLayout.PREFERRED_SIZE, 26, GroupLayout.PREFERRED_SIZE)
                                            .addGroup(jPanel4Layout.createSequentialGroup()
                                                .addComponent(mute, GroupLayout.PREFERRED_SIZE, 23, GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)))
                                        .addContainerGap(28, 28));
                        }
                        return jPanel4;
                }
               
                private JLabel getNom2() {
                        if(nom2 == null) {
                                nom2 = new JLabel();
                                //nom2.setHorizontalAlignment(JLabel.CENTER);
                        }
                        return nom2;
                }

                private JScrollPane getJScrollPane1() {
                        if(jScrollPane1 == null) {
                                jScrollPane1 = new JScrollPane();
                                {
                                        bibliotecaModel=new MiModelo();
                                        bibliotecaModel.addColumn("ID");
                                        bibliotecaModel.addColumn("Nombre");
                                        //bibliotecaModel.addColumn(new JLabel("Nombre"));
                                        bibliotecaModel.addColumn("Titulo");
                                        bibliotecaModel.addColumn("Artista");
                                        bibliotecaModel.addColumn("Album");
                                        bibliotecaModel.addColumn("Duracion");
                                       
                                        biblioteca=new MiTabla(bibliotecaModel);
                                        jScrollPane1.setViewportView(biblioteca);
                                        //biblioteca.setModel(bibliotecaModel);
                                        biblioteca.setShowHorizontalLines(false);
                                        biblioteca.setShowVerticalLines(false);
                                        //biblioteca.setPreferredSize(new java.awt.Dimension(715, 443));
                                        biblioteca.addKeyListener(new KeyAdapter(){
                                                public void keyPressed(KeyEvent e){
                                                        if(e.getKeyCode()==127){//Delete
                                                                eliminaCanciones();
                                                        }
                                                        else if(e.getKeyCode()==10){//Enter
                                                                reproduceCancion(e);
                                                        }
                                                        System.out.println(e.getKeyCode());
                                                }
                                        });
                                        biblioteca.addMouseListener(new MouseAdapter()
                                        {
                                                public void mouseClicked(final MouseEvent e){
                                                        if(e.getButton()==MouseEvent.BUTTON1){
                                                                reproduceCancion(e);
                                                                botonIzqPulsado=true;
                                                        }
                                                        if(e.getButton()==MouseEvent.BUTTON3){
                                                                botonIzqPulsado=false;
                                                                int fila = biblioteca.rowAtPoint(e.getPoint());
                                                                int[] rowSelect=biblioteca.getSelectedRows();
                                                                int j=0;
                                                                boolean isSelect=false;
                                                                //Se pregunta si la fila en la que se ha pinchado es una de las filas seleccionadas
                                                                if(fila > -1){
                                                                        while(j<rowSelect.length && !isSelect){
                                                                                if(rowSelect[j]==fila)
                                                                                        isSelect=true;
                                                                                j++;
                                                                        }
                                                                }
                                                                //Si no es una de las filas seleccionadas, se deseleccionan  las filas seleccionadas, y se selecciona la fila en la que se ha pinchado
                                                                if(!isSelect){
                                                                        biblioteca.setRowSelectionInterval(fila, fila);
                                                                }
                                                                menus= new JMenuItem[3];
                                                                menus[0]= new JMenuItem("Eliminar");
                                                                menus[0].addActionListener(new ActionListener(){
                                                                        public void actionPerformed(ActionEvent evt){
                                                                                eliminaCanciones();
                                                                        }
                                                                });
                                                                menus[1]= new JMenuItem("Modificar tags");
                                                                menus[1].addActionListener(new ActionListener(){
                                                                        public void actionPerformed(ActionEvent evt){
                                                                                //aqui va el codigo para ejecutar la opcion 2
                                                                                int fila = biblioteca.rowAtPoint(e.getPoint());
                                                                                if(fila>-1){
                                                                                        String id=(String) bibliotecaModel.getValueAt(fila,0);
                                                                                        try {
                                                                                                setTags(id);
                                                                                        } catch (CannotReadException e1) {
                                                                                                // TODO Auto-generated catch block
                                                                                                e1.printStackTrace();
                                                                                        } catch (IOException e1) {
                                                                                                // TODO Auto-generated catch block
                                                                                                e1.printStackTrace();
                                                                                        } catch (TagException e1) {
                                                                                                // TODO Auto-generated catch block
                                                                                                e1.printStackTrace();
                                                                                        } catch (ReadOnlyFileException e1) {
                                                                                                // TODO Auto-generated catch block
                                                                                                e1.printStackTrace();
                                                                                        } catch (InvalidAudioFrameException e1) {
                                                                                                // TODO Auto-generated catch block
                                                                                                e1.printStackTrace();
                                                                                        } catch (CannotWriteException e1) {
                                                                                                // TODO Auto-generated catch block
                                                                                                e1.printStackTrace();
                                                                                        }
                                                                                }
                                                                        }
                                                                });
                                                                menus[2]= new JMenuItem("Crear lista de reproduccion a partir de la seleccion");
                                                                menus[2].addActionListener(new ActionListener(){
                                                                        public void actionPerformed(ActionEvent evt){
                                                                                int[] rowSelect=biblioteca.getSelectedRows();
                                                                                ArrayList<String> canciones=new ArrayList<String>();
                                                                                for(int i=0;i<rowSelect.length;i++){
                                                                                        canciones.add(""+bibliotecaModel.getValueAt(rowSelect[i],0));
                                                                                }
                                                                                NombreLista nL=new NombreLista(canciones,arbol);
                                                                                nL.setEnabled(true);
                                                                                nL.setVisible(true);
                                                                                nL.setLocationRelativeTo(null);
                                                                        }
                                                                });
                                                                emergente= new JPopupMenu();
                                                                for(byte x=0;x<menus.length;x++){emergente.add(menus[x]);}
                                                                emergente.show(biblioteca,e.getX(),e.getY());
                                                        }
                                                       
                                                }
                                        });
                                        JTableHeader header=biblioteca.getTableHeader();
                                        header.addMouseListener(new MouseAdapter()
                                        {
                                                public void mouseClicked(MouseEvent e){
                                                        int column = biblioteca.columnAtPoint(e.getPoint());
                                                        String title=biblioteca.getColumnName(column);
                                                        if(title.equals("Titulo")){
                                                                bibliotecaXML.ordenaBiblioteca(Biblioteca.Orden.titulo,listaCancionesUso);
                                                        }
                                                        else if(title.equals("Artista")){
                                                                bibliotecaXML.ordenaBiblioteca(Biblioteca.Orden.artista,listaCancionesUso);
                                                        }
                                                        else if(title.equals("Album")){
                                                                bibliotecaXML.ordenaBiblioteca(Biblioteca.Orden.album,listaCancionesUso);
                                                        }
                                                        else if(title.equals("Nombre")){
                                                                bibliotecaXML.ordenaBiblioteca(Biblioteca.Orden.nombre,listaCancionesUso);
                                                        }
                                                        else if(title.equals("Duracion")){
                                                                bibliotecaXML.ordenaBiblioteca(Biblioteca.Orden.duracion,listaCancionesUso);
                                                        }
                                                        cargaBiblioteca();
                                                        actualizaFilaReproducida();
                                                }
                                               
                                        });
                                        //Para que la columna que contiene las IDs no sea visible
                                        TableColumn columna = biblioteca.getColumnModel().getColumn(0);
                                        biblioteca.removeColumn(columna);
                                }
                        }
                        return jScrollPane1;
                }
               
                private JLabel getImageSingle() {
                        if(imageSingle == null) {
                                imageSingle = new JLabel();
                                imageSingle.setText("Imagen del disco");
                        }
                        return imageSingle;
                }
               
                /**
                 * Reproduce la canción elegida por el usuario
                 * @param e
                 */
                public void reproduceCancion(final EventObject e){
                                boolean condicion=false;
                                if(e instanceof MouseEvent)
                                        condicion=((MouseEvent) e).getClickCount() == 2 && botonIzqPulsado;
                                else if(e instanceof KeyEvent)
                                        condicion=true;
                                if (condicion){
                                        int fila=-1;
                                        if(biblioteca.getSelectedRowCount()<=1)
                                                fila=biblioteca.getSelectedRow();
                                        else
                                                fila=biblioteca.getSelectedRows()[0];
                                        if(fila > -1){
                                                String id=(String) bibliotecaModel.getValueAt(fila,0);
                                                Cancion cancion=bibliotecaXML.getCancion(id);
                                                urlDataSource=cancion.getUrl();
                                                CancionActual.setCancionActual(cancion);
                                                if(player!=null)
                                                        player.liberaPlayer();
                                                inicializaRep();
                                                actualizaFilaReproducida();
                                        }
                                }
                }
               
                /**
                 * Elimina las canciones seleccionadas
                 */
                public void eliminaCanciones(){
                        int[] rowSelect=biblioteca.getSelectedRows();
                        for(int i=0;i<rowSelect.length;i++){
                                String id=(String) bibliotecaModel.getValueAt(rowSelect[i],0);
                                //bibliotecaXML.removeCancion(id);
                                if(listaCancionesUso!=bibliotecaXML.getBiblioteca()){
                                        bibliotecaXML.removeCancion(id,listaCancionesUso);
                                }
                                if(!listaMostrada.equals("Musica")){
                                        arbol.eliminaCancion(listaMostrada, id);
                                }else{
                                        bibliotecaXML.removeCancion(id);
                                        arbol.eliminaCancionCarpetas(id);
                                }
                        }
                        cargaBiblioteca();
                }
               
                /**
                 * Carga las listas de reproducción
                 * @param lista
                 */
                public void cargaLista(String lista){
                        if(lista.equals("Musica")){
                                listaCancionesUso=bibliotecaXML.getBiblioteca();
                        }
                        else{
                                Carpeta carpeta=arbol.getCarpeta(lista);
                                ArrayList<Cancion> canciones=new ArrayList<Cancion>();
                                Iterator<String> it=carpeta.getCanciones().iterator();
                                while(it.hasNext()){
                                        String idCancion=(String) it.next();
                                        canciones.add(bibliotecaXML.getCancion(idCancion));
                                }
                                listaCancionesUso=canciones;
                        }
                        cargaBiblioteca();
                }
               
                private JScrollPane getJScrollPane2() {
                        if(jScrollPane2 == null) {
                                jScrollPane2 = new JScrollPane();
                                jScrollPane2.setViewportView(getJTree1());
                        }
                        return jScrollPane2;
                }
                
                private JMenu getAyuda() {
                	if(Ayuda == null) {
                		Ayuda = new JMenu();
                		Ayuda.setText("Ayuda");
                		Ayuda.add(getManualInstDesinst());
                		Ayuda.add(getManualDeUsuario());
                		Ayuda.add(getSobreJALE());
                	}
                	return Ayuda;
                }
                
                private JMenuItem getManualDeUsuario() {
                	if(ManualDeUsuario == null) {
                		ManualDeUsuario = new JMenuItem();
                		ManualDeUsuario.setText("Manual de usuario");
                		ManualDeUsuario.addActionListener(new ActionListener() {
                			public void actionPerformed(ActionEvent evt) {
                				try {
									manualDeUsuarioActionPerformed(evt);
								} catch (MalformedURLException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								} catch (IOException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
                				//TODO add your code for ManualDeUsuario.actionPerformed
                			}
                		});
                	}
                	return ManualDeUsuario;
                }
                
                private JMenuItem getSobreJALE() {
                	if(SobreJALE == null) {
                		SobreJALE = new JMenuItem();
                		SobreJALE.setText("Sobre JALE...");
                		SobreJALE.addActionListener(new ActionListener() {
                			public void actionPerformed(ActionEvent evt) {
                				Informacion info=new Informacion();
                                info.setEnabled(true);
                                info.setVisible(true);
                                info.setLocationRelativeTo(null);
                			}
                		});
                	}
                	return SobreJALE;
                }
                
                private JMenuItem getManualInstDesinst() {
                	if(ManualInstDesinst == null) {
                		ManualInstDesinst = new JMenuItem();
                		ManualInstDesinst.setText("Manual Instalación/Desinstalación");
                		ManualInstDesinst.addActionListener(new ActionListener() {
                			public void actionPerformed(ActionEvent evt) {
                				try {
									manualDeInstDesinstActionPerformed(evt);
								} catch (MalformedURLException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								} catch (IOException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
                				//TODO add your code for ManualInstDesinst.actionPerformed
                			}
                		});
                	}	
                	return ManualInstDesinst;
                }

}

